home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / c / faslsgi4.c < prev    next >
C/C++ Source or Header  |  1992-04-07  |  10KB  |  456 lines

  1. /*
  2. (c) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
  3. Copying of this file is authorized to users who have executed the true and
  4. proper "License Agreement for Kyoto Common LISP" with SIGLISP.
  5. */
  6.  
  7.  
  8. /* make sure we do allocate aligned for double */
  9. /* actually I understand that ld -A wants alignment on
  10.    the page.  ie multiple of 0x1000
  11. */   
  12.  
  13. #define ALIGN 12
  14. char *
  15. alloc_contblock_aligned(size)
  16. int size;
  17. {
  18.    char *tmp_alloc = ALLOC_ALIGNED(alloc_contblock,size,(1<<12));
  19.    bzero(tmp_alloc, size);
  20.    return(tmp_alloc);
  21.  }
  22.  
  23. #define alloc_contblock alloc_contblock_aligned
  24.  
  25.  
  26.  
  27. #ifdef BSD
  28. #include <a.out.h>
  29. #endif
  30.  
  31. #ifdef ATT
  32. #ifdef mips
  33. #include <unistd.h>
  34. #include <aouthdr.h>
  35. #endif
  36. #include <filehdr.h>
  37. #include <scnhdr.h>
  38. #include <syms.h>
  39. #endif
  40.  
  41. #ifdef E15
  42. #include <a.out.h>
  43. #define exec        bhdr
  44. #define a_text        tsize
  45. #define a_data        dsize
  46. #define a_bss        bsize
  47. #define a_syms        ssize
  48. #define a_trsize    rtsize
  49. #define a_drsize    rdsize
  50. #endif
  51.  
  52.  
  53. #define    MAXPATHLEN    1024
  54.  
  55.  
  56. int
  57. fasload(faslfile)
  58. object faslfile;
  59. {
  60.  
  61. #ifdef BSD
  62.     struct exec header, newheader;
  63. #define    textsize    header.a_text
  64. #define    datasize    header.a_data
  65. #define    bsssize        header.a_bss
  66. #define    textstart    sizeof(header)
  67. #define    newbsssize    newheader.a_bss
  68. #endif
  69.  
  70. #ifdef ATT
  71.     struct filehdr fileheader;
  72.     struct scnhdr sectionheader;
  73. #ifdef mips
  74.     struct aouthdr aouthdr, newaouthdr;
  75.     HDRR symhdr;
  76. # define textsize    aouthdr.tsize
  77. # define datasize    aouthdr.dsize
  78. # define bsssize    aouthdr.bsize
  79. # define textstart    sectionheader.s_scnptr
  80. # define newdatasize    newaouthdr.dsize
  81. # define newbsssize    newaouthdr.bsize
  82. #else
  83.     int textsize, datasize, bsssize;
  84.     int textstart;
  85. #endif /* mips */
  86. #endif
  87.  
  88. #ifdef E15
  89.     struct exec header;
  90. #define    textsize    header.a_text
  91. #define    datasize    header.a_data
  92. #define    bsssize        header.a_bss
  93. #define    textstart    sizeof(header)
  94. #endif
  95.  
  96.     object memory, data, tempfile;
  97.     FILE *fp;
  98.     char filename[MAXPATHLEN];
  99.     char tempfilename[32];
  100.     char command[MAXPATHLEN * 2];
  101.     int i;
  102.     object *old_vs_base = vs_base;
  103.     object *old_vs_top = vs_top;
  104. #ifdef IBMRT
  105.  
  106. #endif
  107.  
  108.     coerce_to_filename(faslfile, filename);
  109.  
  110.     faslfile = open_stream(faslfile, smm_input, Cnil, Kerror);
  111.     vs_push(faslfile);
  112.     fp = faslfile->sm.sm_fp;
  113.  
  114. #ifdef BSD
  115.     fread(&header, sizeof(header), 1, fp);
  116. #endif
  117. #ifdef ATT
  118.     fread(&fileheader, sizeof(fileheader), 1, fp);
  119. #ifdef mips
  120.     fread(&aouthdr, AOUTHSZ, 1, fp);
  121. #else
  122. #ifdef S3000
  123.         if(fileheader.f_opthdr != 0) fseek(fp,fileheader.f_opthdr,1);
  124. #endif
  125.     fread(§ionheader, sizeof(sectionheader), 1, fp);
  126.     textsize = sectionheader.s_size;
  127.     textstart = sectionheader.s_scnptr;
  128.     fread(§ionheader, sizeof(sectionheader), 1, fp);
  129.     datasize = sectionheader.s_size;
  130.     fread(§ionheader, sizeof(sectionheader), 1, fp);
  131.     if (strcmp(sectionheader.s_name, ".bss") == 0)
  132.         bsssize = sectionheader.s_size;
  133.     else
  134.         bsssize = 0;
  135. #endif /* mips */
  136. #endif
  137. #ifdef E15
  138.     fread(&header, sizeof(header), 1, fp);
  139. #endif
  140.  
  141.     memory = alloc_object(t_cfdata);
  142.     memory->cfd.cfd_self = NULL;
  143.     memory->cfd.cfd_start = NULL;
  144.     memory->cfd.cfd_size = textsize + datasize + bsssize;
  145. #ifdef mips
  146. #define MIPS_ROUND 0xC    
  147.     memory->cfd.cfd_size += MIPS_ROUND; /* room for 'ld' to round text upward */
  148. #endif
  149.     vs_push(memory);
  150.     memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
  151.  
  152. #ifdef BSD
  153.     fseek(fp,
  154.           header.a_text+header.a_data+
  155.           header.a_syms+header.a_trsize+header.a_drsize,
  156.           1);
  157.     fread(&i, sizeof(i), 1, fp);
  158.     fseek(fp, i - sizeof(i), 1);
  159. #endif
  160.  
  161. #ifdef ATT
  162. #ifdef mips
  163.     fseek(fp, fileheader.f_symptr, SEEK_SET);
  164.     fread(&symhdr, cbHDRR, 1, fp);
  165.     fseek(fp, symhdr.cbExtOffset + symhdr.iextMax * cbEXTR, SEEK_SET);
  166. #else
  167.     fseek(fp,
  168.           fileheader.f_symptr + SYMESZ*fileheader.f_nsyms,
  169.           0);
  170.     fread(&i, sizeof(i), 1, fp);
  171.     fseek(fp, i - sizeof(i), 1);
  172.     while ((i = getc(fp)) == 0)
  173.         ;
  174.     ungetc(i, fp);
  175. #endif /* mips */
  176. #endif
  177.  
  178. #ifdef E15
  179.     fseek(fp,
  180.           header.a_text+header.a_data+
  181.           header.a_syms+header.a_trsize+header.a_drsize,
  182.           1);
  183. #endif
  184.  
  185.     data = read_fasl_vector(faslfile);
  186.     vs_push(data);
  187.     close_stream(faslfile, TRUE);
  188.  
  189.     sprintf(tempfilename, "/tmp/fasltemp%d", getpid());
  190.  
  191. AGAIN:
  192.  
  193. #ifdef BSD
  194.     sprintf(command,
  195.         "ld -d -N -x -A %s -T %x %s -o %s",
  196.         kcl_self,
  197.         memory->cfd.cfd_start,
  198.         filename,
  199.         tempfilename);
  200. #endif
  201. #ifdef ATT
  202. #ifdef mips
  203.     sprintf(command,
  204.         "ld -s -A %s -N -T %x %s -o %s",
  205.         kcl_self,
  206.         (long)memory->cfd.cfd_start+SCNROUND-1&~(SCNROUND-1),
  207.         filename,
  208.         tempfilename);
  209. #else
  210.     coerce_to_filename(symbol_value(siVsystem_directory),
  211.                system_directory);
  212.     sprintf(command,
  213.         "%sild %s %d %s %s",
  214.         system_directory,
  215.         kcl_self,
  216.         memory->cfd.cfd_start,
  217.         filename,
  218.         tempfilename);
  219. #endif /* mips */
  220. #endif
  221. #ifdef E15
  222.     coerce_to_filename(symbol_value(siVsystem_directory),
  223.                system_directory);
  224.     sprintf(command,
  225.         "%sild %s %d %s %s",
  226.         system_directory,
  227.         kcl_self,
  228.         memory->cfd.cfd_start,
  229.         filename,
  230.         tempfilename);
  231. #endif
  232.  
  233.     if (system(command) != 0)
  234.         FEerror("The linkage editor failed.", 0);
  235.  
  236.     tempfile = make_simple_string(tempfilename);
  237.     vs_push(tempfile);
  238.     tempfile = open_stream(tempfile, smm_input, Cnil, Kerror);
  239.     vs_push(tempfile);
  240.     fp = tempfile->sm.sm_fp;
  241.  
  242. #ifdef BSD
  243.     fread(&newheader, sizeof(header), 1, fp);
  244.     if (newbsssize != bsssize) {
  245.         insert_contblock(memory->cfd.cfd_start, memory->cfd.cfd_size);
  246.         bsssize = newbsssize;
  247.         memory->cfd.cfd_start = NULL;
  248.         memory->cfd.cfd_size = textsize + datasize + bsssize;
  249.         memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
  250.         close_stream(tempfile, TRUE);
  251.         unlink(tempfilename);
  252.         goto AGAIN;
  253.     }
  254. #endif
  255. #ifdef mips
  256.     fseek(fp, FILHSZ, SEEK_CUR);
  257.     fread(&newaouthdr, AOUTHSZ, 1, fp);
  258.     if (newdatasize + newbsssize > datasize + bsssize) {
  259.         insert_contblock(memory->cfd.cfd_start, memory->cfd.cfd_size);
  260.         datasize = newdatasize;
  261.         bsssize = newbsssize;
  262.         memory->cfd.cfd_start = NULL;
  263.         memory->cfd.cfd_size = textsize + datasize + bsssize + MIPS_ROUND;
  264.         memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
  265.         close_stream(tempfile, TRUE);
  266.         unlink(tempfilename);
  267.         goto AGAIN;
  268.     }
  269.     fread(§ionheader, sizeof sectionheader, 1, fp);
  270. #endif
  271.     if (fseek(fp, textstart, 0) < 0)
  272.         error("file seek error");
  273. #ifdef mips
  274.     printf("start address -T %x ",memory->cfd.cfd_start);
  275.     bzero(memory->cfd.cfd_start, MIPS_ROUND);
  276.     fread(sectionheader.s_vaddr, textsize + datasize, 1, fp);
  277. #else
  278.     fread(memory->cfd.cfd_start, textsize + datasize, 1, fp);
  279. #endif
  280.     close_stream(tempfile, TRUE);
  281.  
  282.     unlink(tempfilename);
  283.  
  284.     call_init(0,memory,data);
  285.  
  286.     vs_base = old_vs_base;
  287.     vs_top = old_vs_top;
  288.  
  289.     return(memory->cfd.cfd_size);
  290. }
  291.  
  292. #if defined BSD || defined mips
  293.  
  294. int
  295. faslink(faslfile, ldargstring)
  296. object faslfile, ldargstring;
  297. {
  298. #ifdef mips
  299.     struct filehdr faslheader;
  300.     struct aouthdr aouthdr;
  301.     struct scnhdr sectionheader;
  302.     HDRR symhdr;
  303. #define ldcmdfmt    "ld -s -A %s -N -T %x %s %s -o %s"
  304. #else
  305.     struct exec header, faslheader;
  306. #define    textsize    header.a_text
  307. #define    datasize    header.a_data
  308. #define    bsssize        header.a_bss
  309. #define    textstart    sizeof(header)
  310. #define ldcmdfmt    "ld -d -N -x -A %s -T %x %s %s -o %s"
  311. #endif
  312.  
  313.     object memory, data, tempfile;
  314.     FILE *fp;
  315.     char filename[MAXPATHLEN];
  316.     char ldargstr[MAXPATHLEN];
  317.     char tempfilename[32];
  318.     char command[MAXPATHLEN * 2];
  319.     char buf[BUFSIZ];
  320.     int i;
  321.     object *old_vs_base = vs_base;
  322.     object *old_vs_top = vs_top;
  323. #ifdef IBMRT
  324.  
  325. #endif
  326.  
  327.     coerce_to_filename(ldargstring, ldargstr);
  328.     coerce_to_filename(faslfile, filename);
  329.  
  330.     sprintf(tempfilename, "/tmp/fasltemp%d", getpid());
  331.  
  332.     sprintf(command,
  333.         ldcmdfmt,
  334.         kcl_self,
  335.         (int)core_end,
  336.         filename,
  337.         ldargstr,
  338.         tempfilename);
  339.  
  340.     if (system(command) != 0)
  341.         FEerror("The linkage editor failed.", 0);
  342.  
  343.     fp = fopen(tempfilename, "r");
  344.     setbuf(fp, buf);
  345. #ifdef mips
  346.     fseek(fp, FILHSZ, SEEK_CUR);
  347.     fread(&aouthdr, AOUTHSZ, 1, fp);
  348. #else
  349.     fread(&header, sizeof(header), 1, fp);
  350. #endif
  351.     memory = alloc_object(t_cfdata);
  352.     memory->cfd.cfd_self = NULL;
  353.     memory->cfd.cfd_start = NULL;
  354.     memory->cfd.cfd_size = textsize + datasize + bsssize;
  355. #ifdef mips
  356.     memory->cfd.cfd_size += MIPS_ROUND;
  357. #endif
  358.     vs_push(memory);
  359.     memory->cfd.cfd_start = alloc_contblock(memory->cfd.cfd_size);
  360.     fclose(fp);
  361.  
  362.     faslfile = open_stream(faslfile, smm_input, Cnil, Kerror);
  363.     vs_push(faslfile);
  364.     fp = faslfile->sm.sm_fp;
  365.     fread(&faslheader, sizeof(faslheader), 1, fp);
  366. #ifdef mips
  367.     fseek(fp, AOUTHSZ, SEEK_CUR);
  368.     fread(§ionheader, SCNHSZ, 1, fp);
  369.     fseek(fp, faslheader.f_symptr, SEEK_SET);
  370.     fread(&symhdr, cbHDRR, 1, fp);
  371.     fseek(fp, symhdr.cbExtOffset + symhdr.iextMax * cbEXTR, SEEK_SET);
  372. #else
  373.     fseek(fp,
  374.           faslheader.a_text+faslheader.a_data+
  375.           faslheader.a_syms+faslheader.a_trsize+faslheader.a_drsize,
  376.           1);
  377.     fread(&i, sizeof(i), 1, fp);
  378.     fseek(fp, i - sizeof(i), 1);
  379. #endif
  380.     data = read_fasl_vector(faslfile);
  381.     vs_push(data);
  382.     close_stream(faslfile, TRUE);
  383.  
  384.     sprintf(command,
  385.         ldcmdfmt,
  386.         kcl_self,
  387. #ifdef mips
  388.         (long)memory->cfd.cfd_start+SCNROUND-1&~(SCNROUND-1),
  389. #else
  390.         memory->cfd.cfd_start,
  391. #endif
  392.         filename,
  393.         ldargstr,
  394.         tempfilename);
  395.  
  396.     if (system(command) != 0)
  397.         FEerror("The linkage editor failed.", 0);
  398.  
  399.     tempfile = make_simple_string(tempfilename);
  400.     vs_push(tempfile);
  401.     tempfile = open_stream(tempfile, smm_input, Cnil, Kerror);
  402.     vs_push(tempfile);
  403.     fp = tempfile->sm.sm_fp;
  404.  
  405. #ifdef mips
  406.     fseek(fp, FILHSZ, SEEK_CUR);
  407.     fread(&aouthdr, AOUTHSZ, 1, fp);
  408.     fread(§ionheader, sizeof sectionheader, 1, fp);
  409. #endif
  410.  
  411.     if (fseek(fp, textstart, 0) < 0)
  412.         error("file seek error");
  413. #ifdef mips
  414.     printf("start address -T %x ",memory->cfd.cfd_start);
  415.     bzero(memory->cfd.cfd_start, MIPS_ROUND);
  416.     fread(sectionheader.s_vaddr, textsize + datasize, 1, fp);
  417. #else
  418.     fread(memory->cfd.cfd_start, textsize + datasize, 1, fp);
  419. #endif
  420.     close_stream(tempfile, TRUE);
  421.  
  422.     unlink(tempfilename);
  423.  
  424.     call_init(0,memory,data);
  425.  
  426.     vs_base = old_vs_base;
  427.     vs_top = old_vs_top;
  428.  
  429.     return(memory->cfd.cfd_size);
  430. }
  431.  
  432. siLfaslink()
  433. {
  434.     bds_ptr old_bds_top;
  435.     int i;
  436.     object package;
  437.  
  438.     check_arg(2);
  439.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  440.     check_type_string(&vs_base[1]);
  441.     vs_base[0] = coerce_to_pathname(vs_base[0]);
  442.     vs_base[0]->pn.pn_type = FASL_string;
  443.     vs_base[0] = namestring(vs_base[0]);
  444.     package = symbol_value(Vpackage);
  445.     old_bds_top = bds_top;
  446.     bds_bind(Vpackage, package);
  447.     i = faslink(vs_base[0], vs_base[1]);
  448.     bds_unwind(old_bds_top);
  449.     vs_top = vs_base;
  450.     vs_push(make_fixnum(i));
  451. }
  452.  
  453. #endif
  454.  
  455. #define FASLINK
  456.